/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pbl_cliente;

import InterfaceCliente.*;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.*;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author Asuka
 */
public class PBL_cliente {

    // CADASTRO_FRAME cadastrar;
    /**
     * @param args the command line arguments
     */
    // private static Socket cliente;
    public static void main(String[] args) throws UnknownHostException, IOException {
        
        new PBL_cliente("localhost", 12345).executa();  //10.65.103.91 //192.168.43.5
        //10.65.98.54
        //192.168.43.5
    }
    private String IPhost;
    private int porta;
    Recebedor recebeDoServidor;
    private String DadosServidor;
    Socket socketCliente;
    private TelaLogin telaLogin;
    //private TelaPrincipal telaPrincipal;
    List<String> listaUsuariosON;
    List<String> listaUsuariosCadastrados;
    //List<String> conexoesAtivas;
    String meuEmail;
    private TelaPrincipal tp;
    private String emailUsuarioConectado;
    List<String> listaCompromissosCadastrados;
    String minhaPorta;
    ServerSocket meuSocketLadoServidor;
    List<String> listaConexoesAtivas;
    RecebeUsuarioChat recebeUsuarioChat;
    int contChat = 2;
    
    public PBL_cliente(String ip, int port) {
        
        this.IPhost = ip;
        this.porta = port;
        listaUsuariosON = new ArrayList<String>();
        listaUsuariosCadastrados = new ArrayList<String>();
        this.listaCompromissosCadastrados = new ArrayList<String>();
        this.listaConexoesAtivas = new ArrayList<String>();
        
    }
    
    public void executa() {
        
        try {
            
            socketCliente = new Socket(this.IPhost, this.porta);
            System.out.println("O cliente se conectou ao servidor!");
            new Thread(new Recebedor(this.socketCliente.getInputStream(), this)).start();
            TrataMsgsVindasServidor("O cliente se conectou ao servidor!:");

//           RecebedorPing rbp = new RecebedorPing(this.socketCliente.getInputStream(), this.socketCliente.getOutputStream(),this);
//           new Thread(rbp).start();
            
        } catch (IOException er) {
            
            System.out.println("erro1: " + er.getMessage());
            
        }
        
    }
    
    public String getEmailUsuarioConectado() {
        return emailUsuarioConectado;
    }

    public Socket getSocketCliente() {
        return socketCliente;
    }

    public int getContChat() {
        return contChat;
    }
    
    public void decContChat(){
        this.contChat--;
    } 
    
    public void incContChat(){
        this.contChat++;
    }
     
   
    public synchronized void TrataMsgsVindasServidor(String msg) {
        
        DataOutputStream escrevendoProServidor = null;
        DadosServidor = msg;
        //System.out.println(DadosServidor);
        try {
            
            escrevendoProServidor = new DataOutputStream(this.socketCliente.getOutputStream());

            String[] dadosDivididos = DadosServidor.split(":");
            if (dadosDivididos[0].equals("O cliente se conectou ao servidor!")) {
                
                TelaLogin login = new TelaLogin(socketCliente, this);
                telaLogin = login;
                
            }
            
            if (dadosDivididos[0].equals("CAD")) {
                
                
                escrevendoProServidor.writeUTF(DadosServidor);
                
                new Thread(new Recebedor(this.socketCliente.getInputStream(), this)).start();
                
            }
            
            if (DadosServidor.split(":")[0].equals("CAD_COMP")) { //Envia os dados do cadastro de compromisso

                System.out.println("Enviando cadastro de compromisso para o servidor");
                escrevendoProServidor.writeUTF(DadosServidor);
                new Thread(new Recebedor(this.socketCliente.getInputStream(), this)).start();
                
            }
            
            if (dadosDivididos[0].equals("Este Email já esta cadastrado!")) {
                
                
                JOptionPane.showMessageDialog(null, "Este Email já esta cadastrado!");
                TelaCadastro cadastro = new TelaCadastro(socketCliente, this);
                
            }
            if (dadosDivididos[0].equals("AbraTelaLogin")) {
                
                TelaLogin login = new TelaLogin(socketCliente, this);
                telaLogin = login;
                
            }
            if (dadosDivididos[0].equals("LOGIN")) {
                
                
                escrevendoProServidor.writeUTF(DadosServidor);
                meuEmail = dadosDivididos[1];
                new Thread(new Recebedor(this.socketCliente.getInputStream(), this)).start();
                
            }
            if (dadosDivididos[0].equals("EsteEmailNaoEstaCadastrado")) {
                
                
                JOptionPane.showMessageDialog(null, "Este email não está cadastrado!");
                
            }
            if (dadosDivididos[0].equals("SenhaIncorreta")) {
                
                JOptionPane.showMessageDialog(null, "Senha incorreta!");
                
            }
            if (dadosDivididos[0].equals("AbraAgenda")) {

                //    System.out.println("oioioi");
                //abrir agenda
                telaLogin.dispose();
                ThreadVerificaOnline th = new ThreadVerificaOnline(this);
                new Thread(th).start();
//                new Thread(new Runnable() {

//                    public void run() {
//                        while(true){
//                            
//                                TrataMsgsVindasServidor("VERIFICARUSERONLINE:");
//                        }
//                    }
//                }).start(); 

                System.out.println("Dados da minha conexão: " + DadosServidor.split(":")[2]);
                String aux = DadosServidor.split(":")[2];
                this.minhaPorta = aux.split("#")[2];
                System.out.println("Minha porta = " + this.minhaPorta);
                
                this.meuSocketLadoServidor = new ServerSocket(Integer.parseInt(minhaPorta));
                this.recebeUsuarioChat = new RecebeUsuarioChat(this.meuSocketLadoServidor, this.meuEmail, this);             
                new Thread(recebeUsuarioChat).start();
                
                this.emailUsuarioConectado = DadosServidor.split(":")[1];
                System.out.println("Login realizado. Email do usuario logado é: " + emailUsuarioConectado);
                tp = new TelaPrincipal(socketCliente, this, listaCompromissosCadastrados, this.listaConexoesAtivas);
                
            }
            
            if (dadosDivididos[0].equals("NenhumUsuarioConectado")) {
                //exibir na tela da agente a msg de nenhum usuario conectado
                //new Thread(new Recebedor(this.socketCliente.getInputStream(), this)).start();
                
            }
            
            if (dadosDivididos[0].equals("USERONLINE")) {
                System.out.println("Recebi usuários online");
                String email1 = dadosDivididos[1];
                
                listaUsuariosON.add(email1);
                consertaListaUsersOnline();
                
                
                //System.out.println("informação no troço: " + DadosServidor);
                if (dadosDivididos.length > 2 && !dadosDivididos[2].isEmpty()) {
                    if (dadosDivididos[2].equals("FIMVERIFICAONLINE")) {
                        tp.setUsuarios(listaUsuariosON);
                        listaUsuariosON = new ArrayList<String>();
                    }
                }
                new Thread(new Recebedor(this.socketCliente.getInputStream(), this)).start();
            }
            
            if (dadosDivididos[0].equals("USERCADASTRADO")) {
                String email2 = dadosDivididos[1];
                
                listaUsuariosCadastrados.add(email2);
                //System.out.println("informação no troço222: " + DadosServidor);
                if (dadosDivididos.length > 2 && !dadosDivididos[2].isEmpty()) {
                    if (dadosDivididos[2].equals("FIMVERIFICACADASTRADOS")) {
                        //System.out.println("entrei no if doido");
                        tp.setUsuariosCadastrados(listaUsuariosCadastrados);
                        listaUsuariosCadastrados = new ArrayList<String>();
                    }
                }
                new Thread(new Recebedor(this.socketCliente.getInputStream(), this)).start();
            }
            
            if (dadosDivididos[0].equals("DADOS_COMPROMISSOS")) {
                System.out.println("Dados dos compromissos enviados pelo servidor!");
                String dadosCompromisso = DadosServidor;
                this.listaCompromissosCadastrados.add(dadosCompromisso);
                System.out.println("Dados de um compromisso enviado pelo servidor: " + DadosServidor);
                if (dadosDivididos.length > 14 && !dadosDivididos[14].isEmpty()) {
                    if (dadosDivididos[14].equals("FIM_COMPROMISSOS")) {
                        System.out.println("Recebi o último compromisso da lista");
                        System.out.println("tamanho da lista de compromissos cadastrados: " + listaCompromissosCadastrados.size());
                        tp.setListaCompromissosNaTela(listaCompromissosCadastrados);
                        //listaCompromissosCadastrados = new ArrayList<String>();
                    }
                }
                new Thread(new Recebedor(this.socketCliente.getInputStream(), this)).start();
            }
            
            if (dadosDivididos[0].equals("DADOS_NOVO_COMPROMISSO")) {
                //System.out.println("Dados dos compromissos enviados pelo servidor!");
                String dadosCompromisso = DadosServidor;
                listaCompromissosCadastrados.add(dadosCompromisso);
                System.out.println("Dados de um compromisso enviado pelo servidor: " + DadosServidor);
                listaCompromissosCadastrados.add(DadosServidor);
                //tp.setListaCompromissosNaTela(listaCompromissosCadastrados);
                tp.setCompromissoNaTela(dadosCompromisso);
                //listaCompromissosCadastrados = new ArrayList<String>();

                new Thread(new Recebedor(this.socketCliente.getInputStream(), this)).start();
            }
            
            if (dadosDivididos[0].equals("CONF_COMP")) {
                
                escrevendoProServidor.writeUTF(DadosServidor);
                new Thread(new Recebedor(this.socketCliente.getInputStream(), this)).start();
                
            }
            
            if (dadosDivididos[0].equals("CONFIRMACAO_COMP")) {
                System.out.println("recebi uma confirmacao");
                String id = dadosDivididos[1];
                String confirmados = dadosDivididos[2];
                System.out.println("confirmados que recebi: " + confirmados);
                System.out.println("tamanho da lista de compromissos cadastrados: " + this.listaCompromissosCadastrados.size());
                for (int i = 0; i < listaCompromissosCadastrados.size(); i++) {
                    //System.out.println("id= " + id + "id da lista= " + listaCompromissosCadastrados.get(i).split(":")[13]);
                    if (listaCompromissosCadastrados.get(i).split(":")[13].equals(id)) {
                        String novosDados = new String();
                        //System.out.println("entrei no if!");
                        String[] dadosCompromisso = listaCompromissosCadastrados.get(i).split(":");
                        for (int c = 0; c < dadosCompromisso.length; c++) {
                            if (c == 11) {
                                if (dadosCompromisso[11].equals("null")) {
                                    dadosCompromisso[11] = "";
                                }
                                novosDados = novosDados + confirmados + ":";
                            }
                            if (c == dadosCompromisso.length - 1) {
                                novosDados = novosDados + dadosCompromisso[c];
                            } else {
                                novosDados = novosDados + dadosCompromisso[c] + ":";
                            }
                            
                        }
                        System.out.println("novos dados: " + novosDados);
                        this.listaCompromissosCadastrados.add(i, novosDados);
                        this.tp.setListaComp(listaCompromissosCadastrados);
                        System.out.println("Usuarios confirmados no compromisso " + id + " são " + this.listaCompromissosCadastrados.get(i).split(":")[11]);
                        break;
                    }
                }
            }
            
            if (dadosDivididos[0].equals("VERIFICARUSERONLINE")) {
                
                
                escrevendoProServidor.writeUTF(DadosServidor);
                new Thread(new Recebedor(this.socketCliente.getInputStream(), this)).start();
                
            }
            
            if (dadosDivididos[0].equals("PING")) {
                //NÃO VAI TER NADA AQUI?
            }
            
            if (DadosServidor.split(":")[0].equals("FIMVERIFICAONLINE")) {

                //  escrevendoProServidor.writeUTF(DadosServidor);
                new Thread(new Recebedor(this.socketCliente.getInputStream(), this)).start();
                
            }
            
            if (dadosDivididos[0].equals("USEROFFLINE")) {
                System.out.println(DadosServidor);
                new Thread(new Recebedor(this.socketCliente.getInputStream(), this)).start();
            }
            if (dadosDivididos[0].equals("MeuStatus")) {
                escrevendoProServidor.writeUTF(DadosServidor);    
                new Thread(new Recebedor(this.socketCliente.getInputStream(), this)).start();
            }  
            
            //Recebe as conexões ativas com os seus dados: email da pessoa, IP dela e a porta para comunicação
            if (dadosDivididos[0].equals("conexoesON")){
                listaConexoesAtivas.clear();
                System.out.println("Recebi conexoesON: " + DadosServidor);
                System.out.println(Integer.parseInt(DadosServidor.split(":")[1]));
                for (int i = 2; i < (Integer.parseInt(DadosServidor.split(":")[1]) + 2); i++){
                    listaConexoesAtivas.add(DadosServidor.split(":")[i]);
                    System.out.println(DadosServidor.split(":")[i]);
                }
                
            }
            
            if(DadosServidor.equals("CotaIndisponivel")){
                System.out.println("Cota indisponível");         
            }
            if(DadosServidor.split(":")[0].equals("CotaLiberada")){
                System.out.println("Cota liberada. ID da cota: " + DadosServidor.split(":")[1]);
                
            }
            if(DadosServidor.equals("PodeAtivarSala")){
                System.out.println("Pode ativar a sala!");
            }
            
        } catch (SocketException exs) {
            
            try {
                
                escrevendoProServidor.writeUTF("desconecteEsteSocket:");
                
            } catch (IOException ex) {
                
                Logger.getLogger(PBL_cliente.class.getName()).log(Level.SEVERE, null, exs);
                
            }
            
            
        } catch (IOException ex) {
            
            System.out.println("erro10: " + ex.getMessage());
            
        }
    }
        
    public void usuarioCriandoCompromisso() {        
        TrataMsgsVindasServidor("MeuStatus:" + getEmailUsuarioConectado() + ":CriandoCompromiso...");            
    }
    
    public void usuarioConsultando() {        
        TrataMsgsVindasServidor("MeuStatus:" + getEmailUsuarioConectado() + ":Consultando...");        
    }
    
    public void consertaListaUsersOnline() {
        for (int i = 0; i < listaUsuariosON.size(); i++) {
            String emailon = listaUsuariosON.get(i);
            for (int j = i + 1; j < listaUsuariosON.size(); j++) {
                if (emailon.equals(listaUsuariosON.get(j))) {
                    listaUsuariosON.remove(j);
                }
            }
        }
    }
}
